package 课上练习0420_scala_method$$class

object Scala_01Method {
  def main(args: Array[String]): Unit = {
    println("===============高阶函数测试====================")
    println((methodParams _).getClass)
    testFunction(methodParams)  //自动转为函数
    testFunction(functionParams)
    println("===============闭包测试====================")
    println(test(2))
    println(testEq.apply(2))
    println("===============柯里化测试====================")
    curriedSum(1)(2)
  }

  // 高阶函数：如果⼀个函数的传⼊参数为函数或者返回值是函数，则该函数即为⾼阶函数
  // 下面函数的入参可以为方法或者函数
  def testFunction(f1: (Int, Int) => Int): Unit = {
    println(f1.getClass)
  }

  def methodParams(a: Int, b: Int): Int = a + b

  val functionParams: (Int, Int) => Int = (a, b) => a + b

  // 闭包：闭包是一个函数，返回值依赖于声明在函数外部的一个或多个变量，函数体内可以访问相应作用域内的任何变量。
  // 闭包通常来讲可以简单的认为是可以访问一个函数里面局部变量的另一个函数。
  val j = 5
  val test: Int => Int = (i: Int) => i * j
  val testEq = new Function[Int, Int] {
    override def apply(i: Int): Int = i * j
  }

  // 柯⾥化：将原来接收两个参数的⼀个函数，转换为两个函数，第⼀个函数接收原先的第⼀个参数，然后返回接收原先第⼆个参数的第⼆个函数
  def curriedSum(x:Int)(y:Int) = x + y
}
